Prevendo preços de carros com estatística

Seminário de modelos lineares

Davi, Diogo, João, Thiago e Eduardo Garcez

2025-01-07

Introdução

O dataset foi escolhido pela plataforma kaggle e trata de observações sobre o mercado automotivo online da Georgia no ano de 2024.

Conforme o schema apresentado a seguir o dataset apresenta diversos detalhes sobre as vendas, condições do carro e outrs detalhes mais específicos.

Para esse trabalho, com o intuito de enfatizar os processos e análises que foram aprendidos na disciplina, tomamos liberdade de manipular o banco fornecido no site e descartar variáveis não utilizadas no modelo.

Abaixo também apresentamos uma tabela com as variáveis que escolhemos enfatizar e serão tratadas no modelo linear simulado.

app_id price car_run_km prod_year engine_volume cylinders airbags abs_break esd el_windows conditioner leather nav_system model_name category man_id man_name category_num
108687133 16000 55600 2021 2000 4 6 TRUE TRUE TRUE TRUE FALSE TRUE Mazda 3 Sedan 24 Mazda 36
108608289 13500 42500 2019 2000 4 6 TRUE TRUE TRUE TRUE FALSE TRUE Mazda 3 Sedan 24 Mazda 36
106961361 134000 38000 2023 4400 8 9 TRUE TRUE TRUE TRUE FALSE TRUE Range Rover Jeep 22 Land Rover 24
107494885 16500 49600 2016 2000 4 6 TRUE TRUE TRUE TRUE FALSE TRUE SLC 300 Cabriolet 25 Mercedes-Benz 5
108126733 32000 20200 2021 3200 4 12 TRUE TRUE TRUE TRUE FALSE TRUE Ranger Pickup 12 Ford 32
108901093 50000 42000 2022 3000 6 12 TRUE TRUE TRUE TRUE FALSE TRUE S5 Sedan 2 Audi 36

Explorando o banco de dados

Estatísticas gerais

price car_run_km prod_year engine_volume cylinders airbags esd el_windows conditioner leather nav_system model_name category man_id man_name category_num
Mínimo 0.00 0.000000e+00 0.00 0.00 0.00 0.00 NA NA NA NA NA NA NA 1.00 NA 1.00
Máximo 8388607.00 1.608998e+06 2025.00 20000.00 12.00 12.00 NA NA NA NA NA NA NA 1249.00 NA 45.00
Mediana 2000.00 1.077735e+05 2017.00 2200.00 4.00 12.00 NA NA NA NA NA NA NA 25.00 NA 36.00
Média 5995.44 1.205337e+05 2015.47 2436.38 4.61 9.36 NA NA NA NA NA NA NA 28.49 NA 29.99
Variância 765991983.88 1.037134e+10 533.59 1297893.57 3.04 14.13 NA NA NA NA NA NA NA 2832.02 NA 51.95
Desvio Padrão 27676.56 1.018398e+05 23.10 1139.25 1.74 3.76 NA NA NA NA NA NA NA 53.22 NA 7.21
Coeficiente de Variação 4.62 8.400000e-01 0.01 0.47 0.38 0.40 NA NA NA NA NA NA NA 1.87 NA 0.24

Graficos das variaveis

Preço

Quilometragem

Ano do carro

Volume do motor

Cilindros

Airbags

Equação do modelo linear

A equação do modelo linear é dada por:

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{esd} + \beta_8 \cdot \text{el_windows} + \beta_9 \cdot \text{conditioner} + \beta_10 \cdot \text{leather} + \beta_11 \cdot \text{nav_system} \]

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + esd + el_windows + conditioner + 
#>     leather + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44074   -5005   -1857    1831 8376743 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     -1.284e+06  6.463e+04 -19.862   <2e-16 ***
#> car_run_km      -2.199e-02  1.861e-03 -11.813   <2e-16 ***
#> prod_year        6.386e+02  3.210e+01  19.896   <2e-16 ***
#> engine_volume    2.484e+00  2.242e-01  11.079   <2e-16 ***
#> cylinders        1.681e+03  1.683e+02   9.984   <2e-16 ***
#> airbags         -4.221e+02  5.515e+01  -7.652    2e-14 ***
#> abs_breakTRUE    1.596e+03  8.257e+02   1.933   0.0532 .  
#> esdTRUE          8.556e+01  7.203e+02   0.119   0.9054    
#> el_windowsTRUE   1.479e+03  1.042e+03   1.420   0.1557    
#> conditionerTRUE -1.146e+03  9.856e+02  -1.163   0.2448    
#> leatherTRUE      1.116e+04  3.815e+04   0.293   0.7699    
#> nav_systemTRUE   1.321e+03  5.371e+02   2.459   0.0139 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54100 degrees of freedom
#> Multiple R-squared:  0.03124,    Adjusted R-squared:  0.03104 
#> F-statistic: 158.6 on 11 and 54100 DF,  p-value: < 2.2e-16

Apenas algumas variáveis apresentaram significância no modelo. Assim, o próximo modelo será construído excluindo as variáveis com p-valor maior que 0,05

#> 
#> Call:
#> lm(formula = price ~ car_run_km + prod_year + engine_volume + 
#>     cylinders + airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#>  -44011   -5008   -1852    1830 8376710 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -1.275e+06  6.395e+04 -19.940  < 2e-16 ***
#> car_run_km     -2.198e-02  1.860e-03 -11.815  < 2e-16 ***
#> prod_year       6.344e+02  3.177e+01  19.970  < 2e-16 ***
#> engine_volume   2.478e+00  2.237e-01  11.076  < 2e-16 ***
#> cylinders       1.682e+03  1.682e+02  10.001  < 2e-16 ***
#> airbags        -4.231e+02  5.482e+01  -7.717 1.21e-14 ***
#> abs_breakTRUE   1.905e+03  5.250e+02   3.628 0.000286 ***
#> nav_systemTRUE  1.389e+03  4.894e+02   2.837 0.004551 ** 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 38150 on 54104 degrees of freedom
#> Multiple R-squared:  0.0312, Adjusted R-squared:  0.03107 
#> F-statistic: 248.9 on 7 and 54104 DF,  p-value: < 2.2e-16

Interpretação dos Coeficientes

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \]

  • \(\beta_0\) (intercept) nos indica que o valor esperado quando do veículo quando todas variáveis independentes são iguais a zero. Logo o beta_0 não tem interpretação prática pois o ano de produção não pode ser 0.

  • car_run_km (Quilometragem): Para cada quilômetro adicional rodado, o preço do veículo diminuí em média -0.02 unidades monetárias, mantendo todas as outras variáveis constantes.

  • prod_year (Ano de produção): Para cada ano adicional de produção, o preço do veículo aumenta em média 634.40 unidades monetárias, mantendo todas as outras variáveis constantes.

  • engine_volume (volume do motor) : Para cada unidade adicional no volume do motor, o preço do veículo aumenta em média 2.47 unidades monetárias, mantendo todas as outras variáveis constantes.

  • cylinders (cilindro adicional): Para cada cilindro adicional, o preço do veículo aumenta em média 1682.0 unidades monetárias, mantendo todas as outras variáveis constantes.

  • airbags Para cada airbags, o preço do veículo diminui em média -423.1 unidades monetárias, mantendo todas as outras variáveis constantes.

  • abs_break (Sistema de freio) Para presença de ABS, o aumento esperado na variável resposta é 1905 unidades monetárias, mantendo todas as outras variáveis constantes.

  • nav_system (Sistema de navegação) Para presença de Sistema de navegação, o aumento esperado na variável resposta é 1389 unidades monetárias, mantendo todas as outras variáveis constantes.

Interpretação do teste F

F-statistic: 248.9
p-valor: < 2.2e-16
Adjusted R-squared: 0.03107

  • F-statistic: O valor de 248.9 indica que a variabilidade explicada pelo modelo é significativamente maior do que a variabilidade não explicada. Em outras palavras, o modelo como um todo é significativo.

  • p-valor: O p-valor é extremamente pequeno (< 2.2e-16), o que significa que a probabilidade de observar um valor de F tão extremo, ou mais extremo, sob a hipótese nula é praticamente zero.

  • Adjusted R-squared: Apenas cerca de 3.1% da variabilidade dos dados observados é explicada pelo modelo ajustado.

  • Conclusão: Apesar do modelo ser estatisticamente significativo como um todo, com um p-valor extremamente pequeno (< 2.2e-16), sua capacidade explicativa é muito limitada, conforme evidenciado pelo \(R^2\) ajustado de apenas 3.1%. Isso indica que o modelo consegue explicar apenas uma pequena fração da variabilidade nos preços dos carros.

    Portanto, prosseguiremos com a análise detalhada dos resíduos, buscando identificar possíveis outliers ou padrões que possam estar influenciando negativamente o desempenho do modelo e comprometendo sua capacidade preditiva.

Voltando a equação…

\[ \text{price} = \beta_0 + \beta_1 \cdot \text{car_run_km} + \beta_2 \cdot \text{prod_year} + \beta_3 \cdot \text{engine_volume} + \beta_4 \cdot \text{cylinders} + \beta_5 \cdot \text{airbags} + \beta_6 \cdot \text{abs_break} + \beta_7 \cdot \text{nav_system} \] Substituindo os valores dos coeficientes estimados, temos:

\[ \begin{align*} \text{price} = &\ -1,275,000 - 0.02198 \cdot \text{car_run_km} + 634.4 \cdot \text{prod_year} + 2.478 \cdot \text{engine_volume} \\ &+ 1,682 \cdot \text{cylinders} - 423.1 \cdot \text{airbags} + 1,905 \cdot \text{abs_break} + 1,389 \cdot \text{nav_system} \end{align*} \]

Multicolinearidade

Outliers podem distorcer as relações entre variáveis, afetando correlações e métricas como o VIF, o que pode dar uma falsa impressão da gravidade da multicolinearidade. Para minimizar esses efeitos, analisamos a multicolinearidade tanto na escala original quanto na logarítmica, já que a transformação logarítmica ajuda a estabilizar a variância e reduzir a influência de valores extremos.

Escala original

VIF
car_run_km 1.276091
prod_year 1.649412
engine_volume 2.026582
cylinders 2.046492
airbags 1.292736
abs_break 1.936921
nav_system 2.093494

Com base nas correlações moderadas entre algumas variáveis explicativas e os baixos valores de VIF (entre 1 e 2), evidenciando que a multicolinearidade não é um problema relevante neste modelo, pois, embora algumas variáveis apresentem covariância moderadas entre si, elas não estão redundantes a ponto de inflacionar a variância dos coeficientes.

Com escala log

Variável VIF
nav_system nav_system 2.077215
car_run_km car_run_km 1.196893
prod_year prod_year 1.557294
cylinders cylinders 2.197210
airbags airbags 1.237580
abs_break abs_break 1.913135
engine_volume engine_volume 2.158339

Mesmo ao aplicar a transformação logarítmica, os valores do VIF permaneceram baixos, indicando que a multicolinearidade não é um problema relevante neste modelo.

Análise de resíduos

Identificação de Outliers por análise de resíduos padronizados

#>    11    55    77   162   180   378   379   380   407   795  1456  1457  2197 
#>    11    55    77   162   180   378   379   380   407   795  1456  1457  2197 
#>  2219  2373  2383  3099  5535  8868 14042 14052 14241 15242 15247 15327 15336 
#>  2219  2373  2383  3099  5535  8868 14042 14052 14241 15242 15247 15327 15336 
#> 15337 16088 16264 16487 16490 17983 20884 23403 23404 24830 25049 25058 27021 
#> 15337 16088 16264 16487 16490 17983 20884 23403 23404 24830 25049 25058 27021 
#> 27495 27543 28364 28381 31189 31565 32687 33664 34315 34755 36383 36384 36386 
#> 27495 27543 28364 28381 31189 31565 32687 33664 34315 34755 36383 36384 36386 
#> 36390 36391 36445 36999 37451 38094 38973 39254 39255 42011 42024 42526 43304 
#> 36390 36391 36445 36999 37451 38094 38973 39254 39255 42011 42024 42526 43304 
#> 45123 46478 46893 46973 46975 47169 47312 47342 48361 49130 50495 51421 52781 
#> 45123 46478 46893 46973 46975 47169 47312 47342 48361 49130 50495 51421 52781 
#> 52782 53177 53708 53911 
#> 52782 53177 53708 53911
#> [1] 82
  • A análise dos resíduos padronizados revelou a presença de 82 outliers, o que evidencia inconsistências nos dados ou no ajuste do modelo, indicando que ele não captura adequadamente a variabilidade dos dados.

Gráfico de Resíduos vs Ajustados

  • O gráfico de Resíduos vs Valores Ajustados apresenta uma distribuição heterogênea, com maior dispersão dos resíduos em valores ajustados mais altos, em torno de 25.000, identificando três outliers principais, sendo um outlier extremo acima de 8 milhões de dólares, que pode ser um erro de registro ou representar uma característica excepcional do banco de dados.
  • Podemos ver que a variância claramente aumenta para valores ajustados extremos, mas não há um padrão claro de curva ou tendência nos resíduos que sugira forte não linearidade.

Teste de Breusch-Pagan para Heterocedasticidade

#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_filter
#> BP = 15.504, df = 7, p-value = 0.03006
  • Portanto, o p-valor menor que 0,05 indica que há evidências de heterocedasticidade nos resíduos do modelo, isto é, de que a variância dos resíduos não é constante.
  • A heterocedasticidade visual identificada é confirmada pelo teste de Breusch-Pagan, que rejeitou a hipótese nula de que os resíduos estejam distribuídos uniformemente ao longo do gráfico de forma homocedástica, com variância constante.
  • Em teoria, os resíduos devem ter média zero, mas, como podemos ver, os resíduos não estão perfeitamente equilibrados em torno da linha horizontal, em y = 0, o que indica que a relação entre as variáveis explicativas e a resposta não foi totalmente capturada pelo modelo, que necessita ter seu ajuste melhorado.

QQ-Plot

  • Os resíduos mostram desvios significativos nas caudas em relação à distribuição normal, indicando violação da suposição de normalidade, possivelmente relacionada à presença de outliers, como os identificados pelos índices 45123 e 14042 ou à variabilidade não explicada adequadamente pelo modelo.

Teste de Durbin-Watson

Teste para verificar autocorrelação nos resíduos:

#> 
#>  Durbin-Watson test
#> 
#> data:  model_filter
#> DW = 1.9792, p-value = 0.007806
#> alternative hypothesis: true autocorrelation is greater than 0
  • O p-valor significativo sugere uma leve autocorrelação positiva, o que vai contra o princípio de independência entre os resíduos. No entanto, dado que o DW está quase em 2, essa autocorrelação pode não ser severa o suficiente para impactar gravemente as inferências do modelo.

Scale-Location

  • O gráfico destaca que os valores do desvio padrão dos resíduos aumentam à medida que os valores ajustados crescem, confirmando a variância não constante observada. Isso pode ter ocorrido por conta de variáveis preditivas que deixamos de considerar.

Pontos Influentes

#> 45123 
#> 45123
#> [1] 1

  • Utilizando a Distância de Cook, são destacadas observações com valores superiores a 4/n, sendo n o número de observações do banco filtrado. O ponto 45123 apresentou um valor elevado, indicando que, além de ser um outlier, exerce uma influência exagerada no modelo. Esse comportamento pode distorcer as estimativas dos coeficientes de regressão e a inferência.

Pontos de Alavanca

#> [1] 3226
  • Sobre os pontos de alavanca, foram identificadas 3226 observações com alta alavancagem, indicando que essas observações têm grande influência no ajuste do modelo devido à sua distância da média das variáveis explicativas. Essa quantidade significativa de pontos sugere um impacto relevante na estrutura do modelo e na estimativa dos coeficientes, o que pode alterar a interpretação dos resultados e reforça a necessidade de verificar a adequação do modelo às características dos dados.

  • No gráfico Resíduos vs Leverage, é possível observar que algumas dessas observações, como os pontos destacados, também são outliers, sendo que o ponto 45123 se destaca por também ser ponto influente. Esses pontos combinam alavancagem elevada e um grande peso nos resíduos, impactando a estabilidade do modelo.

Transformação em log escala

dois modelos lineares foram ajustados com o objetivo de linearizar relações não lineares presentes nos dados e reduzir os efeitos de heterocedasticidade, buscando uma maior precisão nas estimativas.

O primeiro modelo foi ajustado utilizando a transformação logarítmica na variável dependente \(log(price)\), enquanto as variáveis independentes permaneceram em sua escala original:

#> 
#> Call:
#> lm(formula = log(price) ~ car_run_km + prod_year + cylinders + 
#>     airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -2.7563 -0.3448 -0.0139  0.3284  6.9267 
#> 
#> Coefficients:
#>                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -9.485e+01  1.024e+00  -92.64   <2e-16 ***
#> car_run_km     -1.055e-06  2.972e-08  -35.49   <2e-16 ***
#> prod_year       5.114e-02  5.086e-04  100.56   <2e-16 ***
#> cylinders       1.745e-01  1.931e-03   90.35   <2e-16 ***
#> airbags        -1.793e-02  8.777e-04  -20.43   <2e-16 ***
#> abs_breakTRUE   1.753e-01  8.377e-03   20.93   <2e-16 ***
#> nav_systemTRUE  3.068e-01  7.831e-03   39.17   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.611 on 54105 degrees of freedom
#> Multiple R-squared:  0.4169, Adjusted R-squared:  0.4169 
#> F-statistic:  6448 on 6 and 54105 DF,  p-value: < 2.2e-16

O segundo modelo também utilizou a transformação logarítmica na variável dependente \(log(price)\). Contudo, adicionalmente, a transformação logarítmica foi aplicada na variável independente “quilometragem rodada pelo carro”:

#> 
#> Call:
#> lm(formula = log(price) ~ log(car_run_km) + prod_year + cylinders + 
#>     airbags + abs_break + nav_system, data = data_filter)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -2.9795 -0.3372 -0.0052  0.3284  6.9039 
#> 
#> Coefficients:
#>                   Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)     -8.863e+01  1.005e+00  -88.16   <2e-16 ***
#> log(car_run_km) -1.679e-01  3.163e-03  -53.09   <2e-16 ***
#> prod_year        4.894e-02  4.936e-04   99.14   <2e-16 ***
#> cylinders        1.744e-01  1.904e-03   91.62   <2e-16 ***
#> airbags         -1.611e-02  8.665e-04  -18.59   <2e-16 ***
#> abs_breakTRUE    1.840e-01  8.265e-03   22.27   <2e-16 ***
#> nav_systemTRUE   3.145e-01  7.714e-03   40.77   <2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 0.6026 on 54105 degrees of freedom
#> Multiple R-squared:  0.4329, Adjusted R-squared:  0.4328 
#> F-statistic:  6883 on 6 and 54105 DF,  p-value: < 2.2e-16
  • Manutenção de Outliers: Nenhum tratamento foi realizado para remover ou ajustar outliers presentes no conjunto de dados. Todas as observações originais foram mantidas no ajuste dos modelos.

Análise de resíduos

Gráfico de Resíduos vs Ajustados

- A curva azul indica que os resíduos seguem um padrão não aleatório, formando uma curvatura (no formato de “U”).Isso sugere que o modelo pode não estar capturando bem a relação entre as variáveis preditoras e a variável resposta. Um modelo linear pode não ser a melhor escolha

QQ-Plot

  • Os resíduos mostram desvios significativos nas caudas em relação à distribuição normal.

Scale-Location

  • A heterocedasticidade observada indica que os pressupostos de variância constante dos resíduos do modelo linear não são atendidos

Teste de Breusch-Pagan para Heterocedasticidade

#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_log2
#> BP = 3699.5, df = 6, p-value < 2.2e-16
  • Portanto, o p-valor menor que 0,05 indica que há evidências de heterocedasticidade nos resíduos do modelo, isto é, de que a variância dos resíduos não é constante.

Conclusão

  • A transformação log não foi suficiente: Apesar de o logaritmo reduzir a escala e estabilizar a variância em muitos casos, ele pode não corrigir completamente a heterocedasticidade ou a não linearidade.

  • Pode ser que a relação entre as variáveis explicativas (log(car_run_km), prod_year, etc.) e a variável resposta ainda não seja bem representada por um modelo linear.

  • Outliers podem estar influenciando a análise e distorcendo os resultados do modelo.